package com.codeplatform.common;

/**
 * 响应状态码枚举
 * 
 * @author CodePlatform
 * @since 2024-01-01
 */
public enum ResultCode {
    
    /**
     * 成功
     */
    SUCCESS(200, "操作成功"),
    
    /**
     * 客户端错误
     */
    BAD_REQUEST(400, "请求参数错误"),
    
    /**
     * 未授权
     */
    UNAUTHORIZED(401, "未授权访问"),
    
    /**
     * 禁止访问
     */
    FORBIDDEN(403, "禁止访问"),
    
    /**
     * 资源未找到
     */
    NOT_FOUND(404, "资源未找到"),
    
    /**
     * 服务器内部错误
     */
    INTERNAL_SERVER_ERROR(500, "服务器内部错误"),
    
    /**
     * 业务逻辑错误
     */
    BUSINESS_ERROR(1001, "业务处理失败"),
    
    /**
     * 数据验证错误
     */
    VALIDATION_ERROR(1002, "数据验证失败"),
    
    /**
     * 数据库操作错误
     */
    DATABASE_ERROR(1003, "数据库操作失败"),
    
    /**
     * 外部服务调用错误
     */
    EXTERNAL_SERVICE_ERROR(1004, "外部服务调用失败");
    
    /**
     * 状态码
     */
    private final Integer code;
    
    /**
     * 状态描述
     */
    private final String message;
    
    /**
     * 构造函数
     * 
     * @param code 状态码
     * @param message 状态描述
     */
    ResultCode(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
    
    /**
     * 获取状态码
     * 
     * @return 状态码
     */
    public Integer getCode() {
        return code;
    }
    
    /**
     * 获取状态描述
     * 
     * @return 状态描述
     */
    public String getMessage() {
        return message;
    }
    
    /**
     * 根据状态码获取枚举
     * 
     * @param code 状态码
     * @return 对应的枚举值，如果不存在则返回null
     */
    public static ResultCode getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        
        for (ResultCode resultCode : values()) {
            if (resultCode.getCode().equals(code)) {
                return resultCode;
            }
        }
        
        return null;
    }
    
    /**
     * 判断是否为成功状态
     * 
     * @return 是否成功
     */
    public boolean isSuccess() {
        return this == SUCCESS;
    }
    
    /**
     * 判断是否为客户端错误
     * 
     * @return 是否为客户端错误
     */
    public boolean isClientError() {
        return code >= 400 && code < 500;
    }
    
    /**
     * 判断是否为服务器错误
     * 
     * @return 是否为服务器错误
     */
    public boolean isServerError() {
        return code >= 500;
    }
}